package br.com.esporte.view.site.grupo.comunidade.movimentacao;

import java.util.List;

import org.apache.wicket.Component;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.Model;

import br.com.esporte.model.Grupo;
import br.com.esporte.model.Movimentacao;
import br.com.esporte.model.TipoMovimentacaoEnum;
import br.com.esporte.persistence.filter.FiltroMovimentacao;
import br.com.esporte.view.site.grupo.comunidade.PaginaComunidade;

/**
 * 
 * @author Milton Domingues
 *
 */
public class PaginaListarMovimentacao extends PaginaComunidade {

	private static final String FORM_ID = "form";
	private static final String CREDITOS_ID = "creditos";
	private static final String DEBITOS_ID = "debitos";
	private static final String TOTAL_ID = "total";
	private static final String LINK_ADD_MOV_ID = "linkAddMov";
	private static final String LIST_MOV_ID = "listMovi";
	private static final String DESCRICAO_ID = "descricao";
	private static final String VALOR_ID = "valor";

	private List<Movimentacao> movimentacoes;
	private Float debitos;
	private Float creditos;
	private Float total;

	public PaginaListarMovimentacao(Grupo grupo) {
		super(grupo);
	}

	@Override
	public void carregarView() {
		super.carregarView();
		FiltroMovimentacao filtro = new FiltroMovimentacao();
		filtro.addEquals(FiltroMovimentacao.GRUPO, getGrupo());
		List<Movimentacao> movs = getFachada().consultar(filtro);
		setMovimentacoes(movs);
		setDebitos(getValorTipo(movs, TipoMovimentacaoEnum.DEBITO));
		setCreditos(getValorTipo(movs, TipoMovimentacaoEnum.CREDITO));
		setTotal(getValorTipo(movs, null));
	}

	private Link<Grupo> criarLinkMovimentacao(Grupo grupo){
		Link<Grupo> link = new Link<Grupo>(LINK_ADD_MOV_ID, new Model<Grupo>(grupo)) {

			private static final long serialVersionUID = -938779856565598711L;

			@Override
			public void onClick() {
				Grupo grupo = getModelObject();
				setResponsePage(new PaginaCriarMovimentacao(grupo));
			}
		};
		link.setVisible(isModerador());
		return link;
	}

	private ListView<Movimentacao> criarListMovi(List<Movimentacao> movimentacoes){
		ListView<Movimentacao> list = new ListView<Movimentacao>(LIST_MOV_ID, movimentacoes) {

			private static final long serialVersionUID = 7780239446095177108L;

			@Override
			protected void populateItem(ListItem<Movimentacao> item) {
				Movimentacao movimentacao = item.getModelObject();
				item.add(new Label(DESCRICAO_ID, movimentacao.getDescricao()));
				item.add(new Label(VALOR_ID, String.valueOf(movimentacao.getValor())));
			}
		};
		return list;
	}

	private void criatTotais(Form<Component> form){
		StringBuilder creditos = new StringBuilder("R$");
		creditos.append(getCreditos());
		form.add(new Label(CREDITOS_ID, creditos.toString()));

		StringBuilder debitos = new StringBuilder("R$");
		debitos.append(getDebitos());
		form.add(new Label(DEBITOS_ID, debitos.toString()));

		StringBuilder total = new StringBuilder("R$");
		total.append(getTotal());
		form.add(new Label(TOTAL_ID, total.toString()));
	}

	public Float getCreditos() {
		return creditos;
	}

	public Float getDebitos() {
		return debitos;
	}

	public List<Movimentacao> getMovimentacoes() {
		return movimentacoes;
	}

	public Float getTotal() {
		return total;
	}

	private Float getValorTipo(List<Movimentacao> movimentacaos, TipoMovimentacaoEnum tipo){
		Float total = 0.0F;
		for (Movimentacao movimentacao : movimentacaos) {
			if(tipo == null){
				total += movimentacao.getValor();
			}else{
				if(movimentacao.getTipo().equals(tipo)){
					total += movimentacao.getValor();
				}
			}
		}
		return total;
	}

	@Override
	public void montarPagina() {
		super.montarPagina();
		Form<Component> form = new Form<Component>(FORM_ID);
		form.add(criarLinkMovimentacao(getGrupo()));
		form.add(criarListMovi(getMovimentacoes()));
		criatTotais(form);
		addContainer(form);
	}

	public void setCreditos(Float creditos) {
		this.creditos = creditos;
	}

	public void setDebitos(Float debitos) {
		this.debitos = debitos;
	}

	public void setMovimentacoes(List<Movimentacao> movimentacoes) {
		this.movimentacoes = movimentacoes;
	}

	public void setTotal(Float total) {
		this.total = total;
	}

	@Override
	public boolean viewPublica() {
		return true;
	}
}
